package com.cskaoyan.javase.oop2._2polymorphic._2advantage._1method;

/**
 * 思考:
 *      方法的形参数据类型需不需要和方法的实参数据类型完全保持一致呢?
 * 很明显是不需要的,之前已经见过了:
 *      基本数据类型的实参数据类型,如果可以自动类型转换到形参的数据类型
 *      那么这个实参就是允许的
 *
 *      基本数据类型可以,引用数据类型当然也可以:
 *      引用数据类型的实参数据类型,如果可以自动类型转换到形参的数据类型
 *      那么这个实参也是允许传入的
 *      当方法的形参数据类型是父类类型时,允许传入子类对象(向上转型)
 *
 * 以上,方法的形参数据类型和实参数据类型存在"兼容"关系,还有方法的返回值和具体返回值,也有类似特点.
 *
 *
 * @since 15:18
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        test(10L);
        test(10);
        test('a');

        test(new Son());
        test(new Grandson());
        System.out.println("---------------");
        test(new Father());
        test(new Son());
        test(new Grandson());
    }

    public static Father test(){
        // return new Father();
        // return new Son();
        return new Grandson();
    }

    public static void test(long a) {
    }

    public static void test(Son s) {
        System.out.println("test son");
        s.test();
    }

    public static void test(Father s) {
        System.out.println("test father");
        s.test();
    }
}

class Father {
    public void test(){
        System.out.println("father");
    }
}

class Son extends Father {
    @Override
    public void test() {
        System.out.println("son");
    }
}

class Grandson extends Son {
    @Override
    public void test() {
        System.out.println("grandson");
    }
}
